package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.grpc.client.dto.PackageDTO;
import com.bestcem.xm.user.service.dto.group.UserConditionGroupDTO;
import com.bestcem.xm.user.service.dto.user.GrowingioDTO;
import com.bestcem.xm.user.service.dto.user.OrganizationDTO;
import com.bestcem.xm.user.service.dto.user.UserDTO;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户业务Service
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/16 11:07
 */
public interface UserBusinessService {

    /**
     * 查询公司系统管理员用户信息
     *
     * @param orgId 公司id
     * @return ServiceResult<UserDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/16 11:09
     */
    ServiceResult<UserDTO> getAdminUserByOrgId(String orgId);

    /**
     * 查询公司高级管理员用户信息列表
     *
     * @param orgId 公司id
     * @return ServiceResult<List < UserDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/29 20:55
     */
    ServiceResult<List<UserDTO>> getSeniorAdminByOrgId(String orgId);

    /**
     * 查询公司高投放审核角色下的用户信息列表
     *
     * @param orgId 公司id
     * @return ServiceResult<List < UserDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/29 20:55
     */
    ServiceResult<List<UserDTO>> getDeliverCheckUserByOrgId(String orgId);

    /**
     * 判断用户是否具有某个角色
     *
     * @param userId 用户id
     * @param orgId  公司id
     * @param roleId 角色id
     * @return ServiceResult<Boolean>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/14 13:53
     */
    ServiceResult<Boolean> hasRole(String userId, String orgId, String roleId);

    /**
     * 判断用户是否是系统管理员
     *
     * @param userId 用户id
     * @param orgId  公司id
     * @return ServiceResult<Integer>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/14 13:39
     */
    ServiceResult<Integer> checkSuper(String userId, String orgId);

    /**
     * 判断用户是否是超级管理员
     *
     * @param userId 用户id
     * @param orgId  公司id
     * @return ServiceResult<Integer>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/14 13:39
     */
    ServiceResult<Integer> checkSenior(String userId, String orgId);

    /**
     * 创建用户登录日志
     *
     * @param userDTO   用户dto
     * @param ipAddress ip地址
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/2 14:30
     */
    ServiceResult<String> createUserAuthLog(UserDTO userDTO, String ipAddress);

    /**
     * 更新用户的最近登录时间 + 创建用户登录日志
     *
     * @param userDTO
     * @param ipAddress
     * @return ServiceResult<Integer>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/29 17:19
     */
    ServiceResult<Void> updateUserLastLoginTime(UserDTO userDTO, String ipAddress);

    /**
     * 通过角色id和orgId查询用户
     *
     * @param roleId 角色id
     * @param orgId  公司id
     * @return ServiceResult<List < UserDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/17 10:58
     */
    ServiceResult<List<UserDTO>> listUserByRoleId(String roleId, String orgId);

    /**
     * 获取用户的权限
     *
     * @param userId 用户id
     * @param orgId  公司id
     * @return ServiceResult<Map < String, Set < String>>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/18 11:19
     */
    ServiceResult<Map<String, Set<String>>> listUserPermissions(String userId, String orgId);

    /**
     * 获取用户的权限(前端使用)
     *
     * @param userId
     * @param orgId
     * @return ServiceResult<Map < Map < Set < String>>>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/15 17:03
     */
    ServiceResult<Map<String, Map<String, Set<String>>>> listUserPermissionsV2(String userId, String orgId);

    /**
     * 根据orgId查询投放审核角色下的用户（投放审核角色不存在则新建）
     *
     * @param orgId 公司id
     * @return ServiceResult<List < UserDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/5/20 13:31
     */
    ServiceResult<List<UserDTO>> listDeliverCheckerUsers(String orgId);

    /**
     * 上传用户变量信息到growingio
     *
     * @param organizationDTO 公司
     * @param packageDTO      套餐
     * @return ServiceResult<Void>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/5/31 13:23
     */
    ServiceResult<Void> uploadGrowingio(OrganizationDTO organizationDTO, PackageDTO packageDTO);

    /**
     * 根据登录用户名查询免费版用户
     *
     * @param username 登录用户名
     * @return List<UserDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/15 18:15
     */
    ServiceResult<List<UserDTO>> findFreeUserByUsername(String username);

    /**
     * 获取用户的展示用户名
     *
     * @param userDTO 用户数据
     * @return java.lang.String
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/03/7 17:55
     */
    String getDisplayUserName(UserDTO userDTO);


    /**
     * 获取用户的展示用户名
     *
     * @param userId 用户id
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/29 22:07
     */
    ServiceResult<String> getDisplayUserNameByUserId(String userId);

    /**
     * 获取用户属性
     *
     * @param userDTO
     * @param organizationDTO
     * @param packageNameOrId
     * @return ServiceResult<GrowingioDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/29 21:25
     */
    ServiceResult<GrowingioDTO> getUserProperty(UserDTO userDTO, OrganizationDTO organizationDTO, String packageNameOrId);

    /**
     * 通过手机号或者邮箱或者用户名查询用户
     *
     * @param username      邮箱/手机号/用户名
     * @param orgId         公司id
     * @param queryUsername 是否查询用户名
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/7 10:30
     */
    ServiceResult<List<UserDTO>> listUserByPhoneOrEmail(String username, boolean queryUsername, String orgId);

    /**
     * 根据用户名密码查询用户
     *
     * @param username
     * @param password
     * @param orgCode
     * @return ServiceResult<List < UserDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/7/5 14:20
     */
    ServiceResult<List<UserDTO>> listUserByAuth(String username, String password, String orgCode);

    /**
     * 根据用户组织和角色获取用户
     *
     * @param conditionDtoList 查询条件
     * @return 用户信息
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/7/6 10:53
     */
    ServiceResult<List<UserDTO>> listUsersByGroupIdAndRoleId(List<UserConditionGroupDTO> conditionDtoList);


    /**
     * 启用禁用账户时增加删除限额
     *
     * @param userDTO
     * @param isSync  是否是类似于开放平台同步场景，为true时不校验状态流转逻辑
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/12 13:47
     */
    ServiceResult<Integer> updateUser(UserDTO userDTO, boolean isSync);

    /**
     * 账号是否处于账号上传状态
     *
     * @param orgId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/08 20:46
     */
    ServiceResult<Boolean> getLock(String orgId);
}
